﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Text.RegularExpressions;
using System.Xml.Linq;

namespace Proy_Operativos
{
    public partial class Form1 : Form
    {

        #region Atributos

        int _memoriaMax = 0;
        int _memoriaActual = 0;
        string _directorioActual = "/root";
        FileSystem _fileSystem;

        #endregion

        public Form1()
        {
            InitializeComponent();
            _fileSystem = new FileSystem();
            _lblDirActual.Text = "Directorio actual: " + _directorioActual;
        }

        

        private void Form1_Load(object sender, EventArgs e)
        {
            // Initialize the controls and the form.
            
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (validacion(tb_tamdisco.Text))
            {
                _lblMensaje.ForeColor = Color.Green;
                _lblMensaje.Text = "Operación realizada con éxito";
            }
            else
            {
                _lblMensaje.ForeColor = Color.Red;
                _lblMensaje.Text = "Ocurrió un error durante la ejecución de la operación";
            }

            /*try
            {
                // SECTION 1. Create a DOM Document and load the XML data into it.
                XmlDocument dom = new XmlDocument();
                dom.Load(tb_tamdisco.Text);

                // SECTION 2. Initialize the TreeView control.
                treeView1.Nodes.Clear();
                treeView1.Nodes.Add(new TreeNode(dom.DocumentElement.Name));
                TreeNode tNode = new TreeNode();
                tNode = treeView1.Nodes[0];

                // SECTION 3. Populate the TreeView with the DOM nodes.
                AddNode(dom.DocumentElement, tNode);
                
               // treeView1.ExpandAll();
            }
            catch (XmlException xmlEx)
            {
                MessageBox.Show(xmlEx.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }*/
        }
        private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
        {
            XmlNode xNode;
            TreeNode tNode;
            XmlNodeList nodeList;
            int i;

            // Loop through the XML nodes until the leaf is reached.
            // Add the nodes to the TreeView during the looping process.
            if (inXmlNode.HasChildNodes)
            {
                nodeList = inXmlNode.ChildNodes;
                for (i = 0; i <= nodeList.Count - 1; i++)
                {
                    xNode = inXmlNode.ChildNodes[i];
                    inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
                    tNode = inTreeNode.Nodes[i];
                    AddNode(xNode, tNode);
                }
            }
            else
            {
                // Here you need to pull the data from the XmlNode based on the
                // type of node, whether attribute values are required, and so forth.
                inTreeNode.Text = (inXmlNode.OuterXml).Trim();
            }
        }

        private void guardar(XmlNode node)
        {
            foreach (XmlNode node1 in node.ChildNodes)
                foreach (XmlNode node2 in node1.ChildNodes)
                    if (node2.Name == "price")
                    {
                        
                        Decimal price = Decimal.Parse(node2.InnerText);
                        // Increase all the book prices by 20%
                        String newprice = ((Decimal)price * (new Decimal(1.20))).ToString("#.00");
                        Console.WriteLine("Old Price = " + node2.InnerText + "\tNew price = " + newprice);
                        node2.InnerText = newprice;
                    }
        }

        public bool validacion(string comando)
        {
            #region Atributos

            bool _estado = false;
            Match _create = Regex.Match(comando, @"^create \b[0-9]+\b");
            Match _mkdir = Regex.Match(comando, @"^mkdir /\b[/a-zA-Z0-9]+ [a-zA-Z0-9]+");
            Match _file = Regex.Match(comando, @"^file \b[a-zA-Z0-9 ]+");
            Match _cd1 = Regex.Match(comando, @"^cd \b[a-zA-Z0-9]+");
            Match _cd2 = Regex.Match(comando, @"^cd \.(\.)?");
            Match _cd3 = Regex.Match(comando, @"^cd /\b[/a-zA-Z0-9]+");
            Match _ls = Regex.Match(comando, @"^ls\b");
            Match _du = Regex.Match(comando, @"^du\b");
            Match _cat = Regex.Match(comando, @"^cat( /\b([/a-zA-Z0-9_]+)+)+");
            Match _pwd = Regex.Match(comando, @"^pwd\b");
            Match _cpy1 = Regex.Match(comando, @"^cpy( /root\b([/a-zA-Z0-9_\.]+)+)+");
            Match _cpy2 = Regex.Match(comando, @"^cpy C:\\([\\a-zA-Z0-9_\.]+) /root\b([/a-zA-Z0-9_]+)");
            Match _rm1  = Regex.Match(comando, @"^rm \b([a-z0-9-]+)+");
            Match _rm2 = Regex.Match(comando, @"^rm");
            Match _find = Regex.Match(comando, @"^find ([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)*");
            Match _find2 = Regex.Match(comando, @"^find \*(\.[a-zA-Z0-9]+)+");
            Match _tree = Regex.Match(comando, @"^tree\b");
            Match _disk = Regex.Match(comando, @"^disk\b");
            Match _mv = Regex.Match(comando, @"^mv( /root\b([/a-zA-Z0-9_\.]+)+)+ [a-zA-Z0-9]+");

            #endregion

            if (_create.Success)
            {

                var regex = Regex.Match(comando, @"\d+");
                var result = regex.ToString();
                _memoriaMax = Convert.ToInt32(result);
                System.Xml.Linq.XDocument XML = new XDocument(
               new XDeclaration("1.0", "utf-8", "?"),
               new XElement("dir",
                                   new XAttribute("nombre","root")
                  )
           );
                var fech = DateTime.Now;
                var nombre = "Disco" + "-" + fech.Hour + "-" + fech.Minute + "-" + fech.Second + ".xml";
                
                XML.Save(@nombre);
                return true;
            }
            else if (_mkdir.Success)
            {
                string _directorio = "";
                string[] _parametros;
                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                _parametros = _directorio.Split(' ');

                _estado = _fileSystem.mkDir(_parametros[1], _parametros[0]);
                //Se crea el directorio.

                return _estado;
            }
            else if (_ls.Success)
            {
                string _dir = "";
                //Se listan los archivos del directorio.
                _dir = _fileSystem.ls(_directorioActual);

                if (_dir != "error")
                {
                    tb_cont_archivo.Text = _dir;
                    return true;
                }
                else return false;
            }
            else if (_du.Success)
            {
                XmlDocument _xmlMemoria = new XmlDocument();
                return true;
            }
            else if (_pwd.Success)
            {
                tb_cont_archivo.Text = _directorioActual;
                return true;
            }
            else if (_cpy1.Success)
            {
                _estado = false;
                string _directorio = "";
                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                //Se copian los archivos.
                _estado = _fileSystem.cpy(_directorio, true);
                
                return _estado;
            }
            else if (_cpy2.Success)
            {
                _estado = false;
                string _directorio = "";
                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                //Se copian los archivos.
                _estado = _fileSystem.cpy(_directorio, false);

                return _estado;
            }
            else if (_rm1.Success)
            {
                string _archivos = "";
                List<char> _temporal = comando.ToList();

                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _archivos = _archivos + c;
                }
                string[] archivos_borrar = Regex.Split(_archivos, " ");

                for (int i = 1; i <= archivos_borrar.Count(); i++)
                {
                    return _fileSystem.borrararchivos(archivos_borrar[i]);
                }
                return true;
            }
            else if (_rm2.Success)
            {
                //Se elimina el archivo o directorio.
                string[] dir_actual = Regex.Split(_directorioActual, "/");
                var indice = dir_actual.Count() - 1;
                return _fileSystem.borrar(dir_actual[indice]);
            }
            else if (_find.Success)
            {
                string _directorio = "";

                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                List<string> _rutas = _fileSystem.find(_directorio, true);
                //Se buscan los archivos con el nombre indicado 

                if (_rutas.Count() > 0)
                {
                    _directorio = "";

                    foreach (string ruta in _rutas)
                    {
                        _directorio = _directorio + ruta + "     ";
                    }

                    tb_cont_archivo.Text = _directorio;
                }
                else
                    tb_cont_archivo.Text = "No exíste ningún archivo o directorio con el nombre especificado.";

                return true;
            }
            else if (_find2.Success)
            {
                string _directorio = "";

                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                List<string> _rutas = _fileSystem.find(_directorio, false);
                //Se buscan los archivos con el nombre indicado 

                if (_rutas.Count() > 0)
                {
                    _directorio = "";

                    foreach (string ruta in _rutas)
                    {
                        _directorio = _directorio + ruta + "     ";
                    }

                    tb_cont_archivo.Text = _directorio;
                }
                else
                    tb_cont_archivo.Text = "No exíste ningún archivo o directorio con el nombre especificado.";

                return true;
            }
            else if (_tree.Success)
            {
                string[] root = Regex.Split(_directorioActual, "/");


                //Se despliega el árbol a partir del directorio actual.
                XmlNode _documento = _fileSystem.arbol(root);
                if (_documento != null)
                {
                    // SECTION 2. Initialize the TreeView control.
                    treeView1.Nodes.Clear();
                    treeView1.Nodes.Add(new TreeNode(_documento.Attributes[0].Value));
                    TreeNode tNode = new TreeNode();
                    
                    tNode = treeView1.Nodes[0];

                    // SECTION 3. Populate the TreeView with the DOM nodes.
                    AddNode(_documento, tNode);
                    treeView1.ExpandAll();
                    return true;
                }
                return false;
            }
            else if (_disk.Success)
            {
                //Se despliega estado del disco.
                return true;
            }
            else if (_mv.Success)
            {
                string _directorio = "";

                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                //Mover el archivo de lugar
                _estado = _fileSystem.mv(_directorio);

                return _estado;
            }
            else if (_file.Success)
            {
                var _cont_archivo = tb_cont_archivo.Text;

                string _directorio = "";
                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                string[] root = Regex.Split(_directorioActual, "/");
                var indice = root.Count() - 1;
                if (_fileSystem.File(root[indice], _directorio, _cont_archivo, _directorioActual))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (_cd1.Success)
            {
                string _directorio = "";
                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                //Cambia la posicion en el directorio indicado
                //_estado = _fileSystem.cd(_directorioActual, _directorio);
                string _temp = _fileSystem.cdEspecifico(_directorioActual + "/" + _directorio);

                if (_temp != "error")
                {
                    _directorioActual = _directorioActual + "/" + _temp;
                    _lblDirActual.Text = "Directorio actual: " + _directorioActual;
                    return true;
                }
                else
                {
                    return false;
                }

            }
            else if (_cd2.Success)
            {
                if (_directorioActual == "root")
                    return false;
                else
                {
                    string _directorio = "";
                    List<char> _temporal = comando.ToList();
                    _temporal.RemoveAt(0);
                    _temporal.RemoveAt(0);
                    _temporal.RemoveAt(0);

                    foreach (char c in _temporal)
                    {
                        _directorio = _directorio + c;
                    }

                    //Cambia la posicion en el directorio indicado
                    _directorio = _fileSystem.cdRetroceder(_directorioActual, _directorio);

                    if (_directorio != "")
                    {
                        _directorioActual = _directorio;
                        _lblDirActual.Text = "Directorio actual: " + _directorioActual;
                        return true;
                    }
                    else
                        return false;
                }
            }
            else if (_cd3.Success)
            {
                string _directorio = "";
                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }
                //Cambia la posicion en el directorio indicado
                string _temp = _fileSystem.cdEspecifico(_directorio);
                if (_temp != "error")
                {
                    _directorioActual = _directorio;
                    _lblDirActual.Text = "Directorio actual: " + _directorio;
                    return true;
                }
                else
                    return false;
            }
            else if (_cat.Success)
            {
                string _directorio = "";
                string _resultado = "";

                List<char> _temporal = comando.ToList();
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);
                _temporal.RemoveAt(0);

                foreach (char c in _temporal)
                {
                    _directorio = _directorio + c;
                }

                _resultado = _fileSystem.cat(_directorio);

                if (_resultado != "error")
                {
                    tb_cont_archivo.Text = _resultado;
                    return true;
                }
                else
                    return false;
            }
            else
            {
                return false;
            }

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}
